package com.bnz.proxy.dyna;

import com.bnz.proxy.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//JDK的动态代理
public class UserDaoJDKDynzImpl implements InvocationHandler {
	//目标对象
	private UserDao userDao;
	public UserDaoJDKDynzImpl(UserDao userDao){
		this.userDao = userDao;
	}
	//生成代理对象
	public UserDao createProxy(){
		//参数说明：
		//参数1：代表当前对象的类加载器对象
		//参数2：代表目标对象所实现的接口类型的数组
		//参数3：代表实现了InvocationHandler接口的对象
		return (UserDao) Proxy.newProxyInstance(UserDaoJDKDynzImpl.class.getClassLoader(),
									 userDao.getClass().getInterfaces(),this);
	}

	/**
	 * 调用不同的目标对象的方法
	 * 参数1：代表代理对象
	 * 参数2：代表调用的方法
	 * 参数3：代表方法的参数值
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//如果方法名是query，则先执行安全性检查
		if(method.getName().equals("query")){
			checkSecurity();
		}
		//method.invoke(): 参数1：代表要调用方法的目标对象 参数2：代表参数值
		return method.invoke(userDao, args);
	}

	private void checkSecurity(){
		System.out.println("[JDK动态代理]----》正在进行安全性检查！");
	}
}
